package io.mft.datasource.db.accessor.sql;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import cn.hutool.core.util.ObjectUtil;
import io.mft.commons.db.DbUtil;
import io.mft.commons.db.SQL;
import io.mft.commons.exception.MFTException;
import io.mft.datasource.db.accessor.sql.SQLScript.SQLScriptType;
/**
 * 自定义SQL解析器
 * @说明：TODO
 * @类型名称：ApiSQLParser
 * @创建者: 胡常建  
 * @创建时间: 2021年1月26日 下午10:26:33
 * @修改者: 胡常建  
 * @修改时间: 2021年1月26日 下午10:26:33
 */
public class SQLScriptManager {
	private DbUtil dbUtil=new DbUtil(SQLScriptManager.class);
	private static SQLScriptManager instance=new SQLScriptManager();
	private ConcurrentHashMap<String, SQLScript> cache=new ConcurrentHashMap<>();
	public static SQLScriptManager getInstance() {
		return instance;
	}
	private SQLScriptManager() {}
	public void add(SQLScript sqlScript) {
		cache.put(sqlScript.getId(), sqlScript);
		if (sqlScript.getType()==SQLScriptType.sql||sqlScript.getType()==SQLScriptType.sqlfunction||sqlScript.getType()==SQLScriptType.sqlprocedure) {
			parse(sqlScript);
		}
	}
	/**
	 * 解析API
	 * @说明: TODO
	 * @方法名称: parse
	 * @参数 @param api
	 * @返回类型 void    
	 * @创建者: 胡常建  
	 * @创建时间: 2021年1月26日 下午10:29:20
	 * @修改者: 胡常建  
	 * @修改时间: 2021年1月26日 下午10:29:20
	 */
	private void parse(SQLScript sql) {
		if (ObjectUtil.isEmpty(sql.getScript())) {
			throw new MFTException("SQL文本[id:%s]不允许为空",sql.getId());
		}
		if (ObjectUtil.isEmpty(sql.getId())) {
			throw new MFTException("SQL唯一ID[sqlText:%s]不允许为空",sql.getScript());
		}
		dbUtil.parseMapperXmlSQL(sql.getScript());
	}
	/**
	 * 通过参数加载SQL
	 * @说明: TODO
	 * @方法名称: loadSQL
	 * @参数 @param sqlId
	 * @参数 @param parameter
	 * @参数 @return
	 * @返回类型 SQL    
	 * @创建者: 胡常建  
	 * @创建时间: 2021年1月26日 下午10:31:14
	 * @修改者: 胡常建  
	 * @修改时间: 2021年1月26日 下午10:31:14
	 */
	public  SQL loadSQL(String id,Map<String, Object> parameter) {
		SQL sql=  dbUtil.loadParseSQL(id, parameter);
		return sql;
	}
	
	public SQLScript get(String id) {
		return cache.get(id);
	}
}
